<?php

class UserAccess {

	/**
	 * @var Users
	 */
	private static $_user;
	/**
	 * @var array
	 */
	private static $_access;

	/**
	 * Возвращает данные о пользователе, сохраненные в сессии, если они там есть. В противном случае - false.
	 * @return array|false
	 */
	public static function sessionUser() {
		$user = false;
		if (isset($_SESSION['user'])) $user = $_SESSION['user'];
		return $user;
	}

	/**
	 * Возвращает текущее значение переменной self::$_user. Если в self::$_user пусто пытается загрузить туда информацию о пользователе из сессии. Вернет false в случае неудачи.
	 * @return Users|false
	 */
	public static function user() {
		if (!isset($_SESSION)) session_start();
		if (!self::$_user) self::$_user = self::loadFromSession();

		return self::$_user;
	}

	/**
	 * Выполняет запросо к БД, пытаясь загрузить пользоателя на основании данных из массива $data.
	 * @param array $data
	 * @return Users|false
	 */
	public static function load(array $data) {
		if (!isset($data['login']) || !isset($data['password'])) return false;

		$user = Doctrine_Query::create()
						->from("Users u")
						->leftJoin("u.Groups g")
						->leftJoin("g.Roles r")
						->leftJoin("r.rolesModules")
						->where('login = ? AND password = ?', array($data['login'], $data['password']))
						->fetchOne();


		return $user;
	}

	/**
	 *
	 * @param array $data
	 * @return Users|false
	 */
	public static function loadInSession(array $data) {
		self::$_user = self::load($data);
		if (self::$_user && self::$_user->active == 1) $_SESSION['user'] = self::$_user->toArray();

		return self::$_user;
	}

	/**
	 * @return Users|false
	 */
	public static function loadFromSession() {
		//unset($_SESSION['user']);
		$user = false;
		if (isset($_SESSION['user']) && isset($_SESSION['user']['login']) && isset($_SESSION['user']['password'])){
			$user = new Users();
			$user->fromArray($_SESSION['user']);
		}

		return $user;
	}

	/**
	 * 
	 */
	public static function logout() {
		if(self::user()) session_destroy();

		if (isset($_SESSION['user'])) unset($_SESSION['user']);
		if (isset($_SESSION['access'])) unset($_SESSION['access']);

		Request::redirect($_SERVER['HTTP_REFERER']);
	}

	public static function hash($str) {
		return md5($str);
	}

	private static function _access() {
		if (!self::$_access && self::$_user) {
			self::$_access = isset($_SESSION['access']) ? $_SESSION['access'] : self::$_user->getAccess();
			$_SESSION['access'] = self::$_access;
		}

		return self::$_access;
	}

	public static function access($module_name, $type) {
		if (!self::$_user) return false;

		$data = self::_access();

		return isset($data[$module_name]) && isset($data[$module_name][$type]) && $data[$module_name][$type] == 1;
	}

	public static function adminAccess() {
		if (!self::$_user) return false;

		$data = self::_access();

		foreach ($data as $d) {
			if (array_search(1, $d)) return true;
		}

		return false;
	}

}